/* Copyright 2013 University of Padua, Italy
 *
 */

package it.dei.unipd.healthservice.database;

import it.dei.unipd.healthservice.resource.Ordine;

import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

/**
 * Rappresenta gli ordini inevasi
 * 
 * @author Giorgio Vitale
 * @version 1.00
 */
public class ViewOrdiniClientiDatabase {

	/**
	 * Interrogazione al database, ricerca tutti gli ordini da evadere.
	 */
	private static final String STATEMENT_RICERCA_GLOBALE = "SELECT * FROM ordine ORDER BY dataordine desc, dataspedizione desc;";
	/**
	 * Interrogazione al database, ricerca tutti gli ordini da evadere.
	 */
	private static final String STATEMENT_RICERCA_PER_ID = "SELECT * FROM ordine WHERE idordine=? ORDER BY dataordine desc, dataspedizione desc;";
	/**
	 * Interrogazione al database per la ricerca degli ordini con un certo stato.
	 */
	private static final String STATEMENT_RICERCA_PER_STATO = "SELECT * FROM ordine WHERE stato=? ORDER BY dataordine desc, dataspedizione desc;";
	
	/**
	 * Connessione al database
	 */
	private final Connection con;
	/**
	 * ID dell'ordine da cercare
	 */
	private final Integer idOrdine;
	/**
	 * Ricerca per stato
	 */
	private final String stato;
	/**
	 * Risultati della ricerca
	 */
	private final List<Ordine> ordini;

	/**
	 * cerca tutti gli ordini
	 * 
	 * @param con
	 *            connessione al database.
	 * @param mail
	 *            mail del cliente
	 */
	public ViewOrdiniClientiDatabase(Connection con) {
		this(con, null,null);
	}
	/**
	 * cerca un ordine
	 * @param con connessione al database
	 * @param idOrdine ordine da ricercare
	 */
	public ViewOrdiniClientiDatabase(Connection con, Integer idOrdine){
		this(con, idOrdine, null);
	}
	/**
	 * cerca un ordine
	 * @param con connessione al database
	 * @param stato stato da ricercare
	 */
	public ViewOrdiniClientiDatabase(Connection con, String stato){
		this(con, null, stato);
	}
	
	/**
	 * cerca un ordine
	 * @param con connessione al database
	 * @param idOrdine ordine da ricercare
	 * @param stato stato da ricercare
	 */
	protected ViewOrdiniClientiDatabase(Connection con, Integer idOrdine, String stato){
		this.con = con;
		ordini = new ArrayList<Ordine>();
		this.idOrdine = idOrdine;
		this.stato = stato;
	}
	
	/**
	 * cerca tutti gli ordini
	 * 
	 * @return lista degli ordini.
	 * 
	 * @throws SQLException
	 *             in caso di problemi nell'accesso al database.
	 */
	public List<Ordine> viewOrdini() throws SQLException {

		PreparedStatement pstmt = null;
		ResultSet rs = null;
		try {
			
			if (stato==null)
				pstmt = con.prepareStatement(STATEMENT_RICERCA_GLOBALE);
			else{
				pstmt = con.prepareStatement(STATEMENT_RICERCA_PER_STATO);
				pstmt.setString(1, stato);
			}
			rs = pstmt.executeQuery();
			while (rs.next()) {
				ordini.add(new Ordine(rs.getInt("idordine"),
						rs.getDate("dataordine"), 
						rs.getDate("dataspedizione"), 
						rs.getString("stato"), 
						rs.getInt("idrecapito"), 
						rs.getString("mail")));
			}
		} finally {
			if (rs != null) {
				rs.close();
			}
			if (pstmt != null) {
				pstmt.close();
			}
			con.close();
		}
		return ordini;
	}

	/**
	 * cerca un ordine
	 * 
	 * @return l'ordine cercato, se esiste, altrimenti null
	 * @throws SQLException
	 *             in caso di problemi nell'accesso al database.
	 */
	public Ordine viewOrdine() throws SQLException {

		PreparedStatement pstmt = null;
		ResultSet rs = null;
		try {
			if (idOrdine==null) throw new SQLException("Errore! ID non specificato.");
			pstmt = con.prepareStatement(STATEMENT_RICERCA_PER_ID);
			pstmt.setInt(1, idOrdine);
			rs = pstmt.executeQuery();
			while (rs.next()) {
				ordini.add(new Ordine(rs.getInt("idordine"),
						rs.getDate("dataordine"), 
						rs.getDate("dataspedizione"), 
						rs.getString("stato"), 
						rs.getInt("idrecapito"), 
						rs.getString("mail")));
			}
		} finally {
			if (rs != null) {
				rs.close();
			}

			if (pstmt != null) {
				pstmt.close();
			}

			con.close();
		}
		if (ordini.isEmpty()) return null;
		return ordini.get(0);
	}
}
